package cn.regexp.advice;

import cn.regexp.exception.LogicException;
import cn.regexp.utils.JsonResult;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ResponseBody;

import java.text.SimpleDateFormat;
import java.util.Date;

@ControllerAdvice
public class CommonControllerHandler {
    @ExceptionHandler(LogicException.class)
    @ResponseBody
    public JsonResult<Object> handleLogicException(Exception e) {
        e.printStackTrace();
        return JsonResult.error(500, e.getMessage(), null);
    }

    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public JsonResult<Object> handleRuntimeException(Exception e) {
        e.printStackTrace();
        return JsonResult.defaultError();
    }

    @InitBinder
    // SpringMVC并不能对所有类型的参数都进行绑定，该注解则能够对WebDataBinder对象进行初始化，
    // WebDataBinder是DataBinder的子类，用于完成表单参数到JavaBean属性的绑定
    public void handleDateFormat(WebDataBinder binder) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        /*
            setLenient()：是否严格解析日期
            true：表示Java会对日期进行计算，比如日期为2021-13-01，则13个月会计算为1年1个月，即日期变为2022-01-01
            false：表示Java不会对日期进行计算，若输入非法日期，则直接抛出异常
         */
        format.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(format, true));
    }
}
